Na aula passada, vimos que os domicílios são a unidade amostral, enquando as unidades de consumo (UC) são a unidade básica de pesquisa. Em linhas gerais, isso significa que a seleção de pessoas entrevistadas pela POF se dá pela seleção dos domicílio, no procedimento descrito anteriormente. E que as informações da pesquisa são agregadas, no nível mais básico, por unidades de consumo. Ou seja, ao contrário da PNAD Contínua Anual, na qual a renda per capita (por exemplo) significa a renda média dos moradores de um mesmo domicílio, na POF ela significa a renda média dos membros da unidade de consumo.
Um domicílio contém ao menos uma unidade de consumo, e toda unidade de consumo pertence a um e apenas um domicílio. Analogamente, uma unidade de consumo contém ao menos uma pessoa, e toda pessoa pertence a uma e apenas uma unidade de consumo.
Nessa discussão, dois registros são centrais. O primeiro é DOMICÍLIO, que contém dados sobre todos os domicílios da amostra, como água corrente, coleta de lixo e energia elétrica. Nesse registro, cada linha é um domicílio (o total de linhas é o total de domicílios na amostra da POF). O segundo é MORADOR, que contém dados de todas as pessoas da amostra, como idade, anos de estudo e se lancha na creche. Nesse registro, cada linha é uma pessoa, e o total de linhas é o total de pessoas na amostra da POF. Não há um registro “unidades de consumo”.
Assim, precisamos criar indicadores que permitam identificar os domicílios, unidades de consumo e pessoas entre os diferentes registros da POF (no último caso, nem sempre será possível).
Primeiro, vamos carregar os dois registros da POF
library(tidyverse)
pof_domicilio <- read_rds("./dados/pof_domicilio.rds")
pof_morador <- read_rds("./dados/pof_morador.rds")
Como a pof_domicilio tem o domicílio como maior nível de desagregação, só poderemos criar um identificador de domicílio (id_dom). Basicamente o id_dom é composto pelo identificador da UPA e pelo número do domicílio naquela UPA.
A função str_c agrupa conjuntos de caracteres. É
semelhante ao CONCATENAR do Excel. A função
n_distinct retorna o número de valores distintos da
variável e n retorna o número de elementos (no caso de um
df, o número de linhas)
pof_domicilio <- pof_domicilio %>%
mutate(id_dom = str_c(COD_UPA, NUM_DOM))
pof_domicilio %>%
summarise(numero_domicilios = n_distinct(id_dom),
numero_linhas = n())
## # A tibble: 1 × 2
## numero_domicilios numero_linhas
## <int> <int>
## 1 57920 57920
Como podemos ver, os números são iguais.
Agora na pof_morador, podemos criar identificadores de domicílio (id_dom), de unidade de consumo (id_uc) e de pessoas (id_pes).
pof_morador <- pof_morador %>%
mutate(id_dom = str_c(COD_UPA, NUM_DOM),
id_uc = str_c(COD_UPA, NUM_DOM, NUM_UC),
id_pes = str_c(COD_UPA, NUM_DOM, NUM_UC, COD_INFORMANTE))
pof_morador %>%
summarise(numero_domicilios = n_distinct(id_dom),
numero_uc = n_distinct(id_uc),
numero_pessoas = n_distinct(id_pes),
numero_linhas = n())
## # A tibble: 1 × 4
## numero_domicilios numero_uc numero_pessoas numero_linhas
## <int> <int> <int> <int>
## 1 57920 58039 178419 178431
O número de domicílios é o mesmo do registro pof_domicílios - está correto. Mas o número de pessoas não está igual ao número de linhas. Qual foi o erro? O erro é um problema no tamanho das variáveis NUM_DOM, NUM_UC e COD_INFORMANTE.
pof_morador %>%
group_by(id_pes) %>%
mutate(x = n()) %>%
ungroup() %>%
filter(x > 1) %>%
select(COD_UPA, NUM_DOM, NUM_UC, COD_INFORMANTE, id_pes) %>%
arrange(id_pes)
## # A tibble: 24 × 5
## COD_UPA NUM_DOM NUM_UC COD_INFORMANTE id_pes
## <chr> <chr> <chr> <chr> <chr>
## 1 120005467 1 1 11 1200054671111
## 2 120005467 11 1 1 1200054671111
## 3 130017335 1 1 11 1300173351111
## 4 130017335 11 1 1 1300173351111
## 5 130017335 1 1 12 1300173351112
## 6 130017335 11 1 2 1300173351112
## 7 130017335 1 1 13 1300173351113
## 8 130017335 11 1 3 1300173351113
...
Pegando as primeiras duas linhas como exemplo, vemos que o erro é
causado pela combinação do mesmo valor para COD_UPA e
NUM_UC com, em um caso NUM_DOM == 11 e
COD_INFORMANTE == 1 e, no outro, NUM_DOM == 1
e COD_INFORMANTE == 11, gerando assim o mesmo
id_pes para duas pessoas diferentes.
Para resolver isso, basta termos todos os valores de NUM_DOM, NUM_UC e COD_INFORMANTE com dois dígitos (01 ao invés de 1). Lembrando que precisamos dessa alteração em todos os registros da POF, pois esses indicadores são nossas chaves para agregar as diferentes tabelas.
Fazemos então
pof_domicilio <- pof_domicilio %>%
mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
id_dom = str_c(COD_UPA, NUM_DOM))
pof_morador <- pof_morador %>%
mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
COD_INFORMANTE = str_pad(COD_INFORMANTE, 2, "left", "0"),
id_dom = str_c(COD_UPA, NUM_DOM),
id_uc = str_c(COD_UPA, NUM_DOM, NUM_UC),
id_pes = str_c(COD_UPA, NUM_DOM, NUM_UC, COD_INFORMANTE))
pof_domicilio %>%
summarise(numero_domicilios = n_distinct(id_dom),
numero_linhas = n())
## # A tibble: 1 × 2
## numero_domicilios numero_linhas
## <int> <int>
## 1 57920 57920
pof_morador %>%
summarise(numero_domicilios = n_distinct(id_dom),
numero_uc = n_distinct(id_uc),
numero_pessoas = n_distinct(id_pes),
numero_linhas = n())
## # A tibble: 1 × 4
## numero_domicilios numero_uc numero_pessoas numero_linhas
## <int> <int> <int> <int>
## 1 57920 58039 178431 178431
Problema resolvido. De fato, é tedioso fazer isso toda vez que for ler a POF. No entanto, é importante mostrar pequenos erros que podem ter efeitos negativos na nossa análise.
Para termos certeza de que estamos usando o número certo de unidades de consumo e de pessoas, podemos tentar replicar algumas tabelas do SIDRA. Como exemplo, vamos fazer o total de famílias e o tamanho médio de famílias para o Brasil e para a Paraíba. A tabela de referência no SIDRA é a 6977 e pode ser acessada clicando aqui.
pof_morador %>%
group_by(id_uc) %>%
mutate(n_uc = n(),
PESO_FINAL = as.numeric(PESO_FINAL)) %>%
ungroup() %>%
filter(V0306 == "1") %>%
summarise(total_uc = sum(PESO_FINAL),
tamanho_medio = round(sum(n_uc*PESO_FINAL)/sum(PESO_FINAL),2))
## # A tibble: 1 × 2
## total_uc tamanho_medio
## <dbl> <dbl>
## 1 69017704. 3
pof_morador %>%
filter(UF == "25") %>%
group_by(id_uc) %>%
mutate(n_uc = n(),
PESO_FINAL = as.numeric(PESO_FINAL)) %>%
ungroup() %>%
filter(V0306 == "1") %>%
summarise(total_uc = sum(PESO_FINAL),
tamanho_medio = round(sum(n_uc*PESO_FINAL)/sum(PESO_FINAL),2))
## # A tibble: 1 × 2
## total_uc tamanho_medio
## <dbl> <dbl>
## 1 1265385. 3.13
Antes de falar sobre como calcular as despesas, vale demonstrar a
integração entre os diferentes registros. Para analisarmos o valor e
composição de despesas de diferentes grupos populacionais, precisamos de
informações de pessoas, famílias e domicílios. Assim, é preciso integrar
as informações de despesa, que estão nos registros Aluguel
estimado, Caderneta coletiva, Despesa coletiva,
Despesa individual, Rendimento do trabalho e
Outros rendimentos aos registros Morador e
Domicílio. Isso é feito por meio das variáveis indicadoras
id_dom e id_uc. Vamos usar como exemplo os
registros Morador e Aluguel estimado.
pof_aluguel_estimado <- read_rds("./dados/pof_aluguel_estimado.rds") %>%
mutate(NUM_DOM = str_pad(NUM_DOM, 2, "left", "0"),
NUM_UC = str_pad(NUM_UC, 2, "left", "0"),
id_dom = str_c(COD_UPA, NUM_DOM),
id_uc = str_c(COD_UPA, NUM_DOM, NUM_UC))
pof_join <- pof_morador %>%
left_join(pof_aluguel_estimado, by = "id_uc")
Percebam que, aqui, eu usei o left_join, com
pof_morador no primeiro argumento. Isso vem porque queremos
preservar todas as linhas dessa tabela, para podermos separar os gastos
por características das pessoas e das famílias.
Para começar a olhar as despesas, temos três arquivos centrais:
indice <- readxl::read_xls("./memoria_de_calculo/Indice_Despesa.xls")
tradutor <- readxl::read_xls("./tradutores/Tradutor_Despesa_Geral.xls")
cadastro <- readxl::read_xls("./documentacao/Cadastro de Produtos.xls",
col_types = "text")
O cadastro de produtos relaciona o código do produto com sua respectiva descrição e o quadro no qual o produto se encontra.
cadastro
## # A tibble: 13,474 × 3
## QUADRO `CÓDIGO DO PRODUTO` `DESCRIÇÃO DO PRODUTO`
## <chr> <chr> <chr>
## 1 0 000101 ALUGUEL ESTIMADO
## 2 6 600101 ENERGIA ELETRICA (KWH)
## 3 6 600201 AGUA E ESGOTO
## 4 6 600301 GAS ENCANADO
## 5 6 600401 TELEFONE FIXO
## 6 6 600501 ACESSO A INTERNET (DISCADA, BANDA LARGA, VIA SATE…
...
A tabela indice apenas relaciona o nível de desagregação da despesa com sua respectiva descrição.
indice
## # A tibble: 93 × 3
## INDICE NIVEL DESCRICAO
## <dbl> <dbl> <chr>
## 1 1 0 DESPESA TOTAL
## 2 2 1 DESPESAS CORRENTES
## 3 3 11 DESPESAS DE CONSUMO
## 4 4 1101 ALIMENTACAO
## 5 5 1102 HABITACAO
## 6 6 110201 ALUGUEL
...
Por fim, a tabela mais importante para nós é a tradutor, pois ela contém todas as informações que precisamos para conduzir uma análise de despesa.
tradutor
## # A tibble: 5,318 × 14
## Codigo Variavel Nivel_0 Descricao_0 Nivel_1 Descricao_1 Nivel_2 Descricao_2
## <dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl> <chr>
## 1 10001 V8000_DEF… 0 Despesa To… 1 Despesas C… 11 Despesas d…
## 2 10004 V8000_DEF… 0 Despesa To… 1 Despesas C… 11 Despesas d…
## 3 10002 V8000_DEF… 0 Despesa To… 1 Despesas C… 11 Despesas d…
## 4 10009 V8000_DEF… 0 Despesa To… 1 Despesas C… 11 Despesas d…
## 5 1 V8000_DEF… 0 Despesa To… 1 Despesas C… 11 Despesas d…
## 6 10005 V8000_DEF… 0 Despesa To… 1 Despesas C… 11 Despesas d…
...
Na POF, cada item é registrado com um código de 7 dígitos, identificado pela variável V9001. Os dois primeiros dígitos são correspondentes ao quadro, enquanto os outros 5 são identificadores de cada item de despesa. Porém, olhando a tabela cadastro, vemos que alguns código possuem menos de 7 dígitos. Isso é causado pela mesma questão que aconteceu com as variáveis indicadoras. Se o número do quadro é 6 (por exemplo), o código fica com 6 dígitos (porque o dado não carrega como “06”). Então, para evitar quaisquer problemas, vamos transformar todos os códigos em 7 dígitos
cadastro <- cadastro %>%
janitor::clean_names() %>%
mutate(codigo_7 = str_pad(codigo_do_produto, 7, "left", "0"))
A tabela tradutor também tem valores de código com menos de 7 dígitos. Em parte, isso também é causado por essa questão do número do quadro ter menos de 2 dígitos. No entanto, a principal questão é que não foram incluídos em 2 últimos dígitos de cada item. Essencialmente, itens muito semelhantes (ou da mesma natureza) foram agrupados nos códigos de 5 dígitos. Vamos ver alguns exemplos disso, usando a tabela cadastro.
cadastro <- cadastro %>%
mutate(codigo_5 = str_sub(codigo_7, 1, -3))
cadastro %>%
group_by(codigo_5) %>%
mutate(n = n()) %>%
ungroup() %>%
filter(n > 1) %>%
arrange(n, codigo_5)
## # A tibble: 9,938 × 6
## quadro codigo_do_produto descricao_do_produto codigo_7 codigo_5 n
## <chr> <chr> <chr> <chr> <chr> <int>
## 1 7 700101 GAS DE BOTIJAO (COMBUSTIVEL… 0700101 07001 2
## 2 7 700102 GAS DE BUJAO (COMBUSTIVEL D… 0700102 07001 2
## 3 7 700201 AGUA PARA USO GERAL 0700201 07002 2
## 4 7 700202 PIPA DE AGUA 0700202 07002 2
## 5 7 701001 GAS DE BOTIJAO PARA ILUMINA… 0701001 07010 2
## 6 7 701002 GAS DE BUJAO PARA ILUMINACAO 0701002 07010 2
## 7 8 800201 TIJOLO (PEQUENOS REPAROS) 0800201 08002 2
## 8 8 800202 BLOCO DE CERAMICA (PEQUENOS… 0800202 08002 2
## 9 8 800801 TINTA (PEQUENOS REPAROS) 0800801 08008 2
## 10 8 800802 VERNIZ (PEQUENOS REPAROS) 0800802 08008 2
...
Como exemplos, temos gás de botijão e gás de bujão e tinta (pequenos reparos) e verniz (pequenos reparos).
Assim, precisamos transformar os códigos da tabela tradutor em 5 dígitos - e é esse que usaremos para analisar os dados da POF
tradutor <- tradutor %>%
janitor::clean_names() %>%
mutate(codigo = str_pad(codigo, 5, "left", "0"))
Agora que temos os códigos de 5 dígitos na tabela tradutor, falta uma informação para começarmos a analisar as despesas - a variável relevante de cada gasto. Basicamente, a POF analisa:
Existem alguns itens que têm mais de uma variável - que representam
gastos de categorias e classificações diferentes. Por exemplo, gastos de
manutenção do lar com eletricista envolvem o valor da despesa
(V8000_DEFLA), associado à categoria Despesa Total >
Despesas Correntes > Despesas de Consumo > Habitação >
Manutenção do lar e recolhimento de INSS
(V1904_DEFLA), associado à categoria Despesa Total >
Despesas Correntes > Outras despesas correntes > Contribuições
trabalhistas.
Assim, além do código, precisamos acertar a variável na hora de calcular as despesas.
Os últimos pontos antes de realizar a análise das despesas são a deflação e a anualização. Como dito na primeira aula, as informações da POF se distribuem ao longo de 24 meses, sendo estabelecido o dia 15 de janeiro de 2018 como data de refrência. Assim, todos os valores precisam ser deflacionados para representarem valores médios desta data. Por sorte, o IBGE já disponibiliza os valores deflacionados: são as variáveis que olhamos acima e que estão na tabela despesa.
A anualização, por sua vez, vem do fato de existirem 4 períodos de
referência para despesas: 7, 30 e 90 dias e 12 meses. Respectivamente,
precisamos multiplicar o valor da despesa em cada um desses períodos por
52, 12, 4 ou 1 (variável FATOR_ANUALIZACAO). Para alguns
itens de despesas de 12 meses (FATOR_ANUALIZACAO == 1),
temos também o número de meses de realização da despesa (variável
V9011). Para saber quais itens se encaixam nesse segundo
caso, o dicionário de variáveis explicita os quadros que precisam da
variável V9011 - podemos também olhar no código fornecido
pelo IBGE memoria_de_calculo/R/Tabela de Despesa Geral.R.
OK! Agora temos tudo o que precisamos.
Basicamente, o processo se resume em:
Como as possibilidades são virtualmente infinitas, vamos focar na tabela 6715 do SIDRA.